﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using WCFOrganizacionREST.Dominio;
using WCFOrganizacionREST.Persistencia;
using System.ServiceModel.Web;
using System.Net;

namespace WCFOrganizacionREST
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "GRUnidadOrganizacionales" en el código, en svc y en el archivo de configuración a la vez.
    public class GRUnidadOrganizacionales : IGRUnidadOrganizacionales
    {

        private GRUnidadOrganizacionalDAO dao = new GRUnidadOrganizacionalDAO();
        private GRUsuarioUODAO daoUsuarioUO = new GRUsuarioUODAO();
        private GRUsuarioDAO daousuario = new GRUsuarioDAO();

        public GRUnidadOrganizacional CrearUnidadOrganizacional(GRUnidadOrganizacional UnidadOrganizacionalACrear)
        {
            GRUnidadOrganizacional aux = dao.Obtener(UnidadOrganizacionalACrear.iCodUOr);

            if (aux!=null)
            {
                throw new WebFaultException<Error>(new Error(){
                    codigoNegocio="CU01",
                    descripcionNegocio="Unidad Organizacional ya existe"
                },HttpStatusCode.InternalServerError);
            }
            return dao.Crear(UnidadOrganizacionalACrear);
        }

        
        
        public GRUnidadOrganizacional ObtenerUnidadOrganizacional(string iCodUOr){

            GRUnidadOrganizacional aux = dao.Obtener(int.Parse(iCodUOr));

            if (aux==null)
            {
                throw new WebFaultException<Error>(new Error(){
                    codigoNegocio="CU02",
                    descripcionNegocio="Unidad Organizacional no registrada"
                },HttpStatusCode.InternalServerError);
            }


               return dao.Obtener(int.Parse(iCodUOr));
        }

       
        
        
        
        public GRUnidadOrganizacional ModificarUnidadOrganizacional(GRUnidadOrganizacional UnidadOrganizacionalAModificar)
        {
            return dao.Modificar(UnidadOrganizacionalAModificar);
        }




        public void EliminarUnidadOrganizacional(string iCodUOr, string iCodUsu)
        {
            string valida = daoUsuarioUO.ValidaEliminacion(int.Parse(iCodUOr), int.Parse(iCodUsu));

            if (valida.Equals("1"))
            {
                throw new WebFaultException<Error>(new Error()
                {
                    codigoNegocio = "EU02",
                    descripcionNegocio = "Unidad Organizacional no puede ser eliminada"
                }, HttpStatusCode.InternalServerError);
            }

            dao.Eliminar(dao.Obtener(int.Parse(iCodUOr)));
        }


        public List<GRUnidadOrganizacional> ListarUnidadOrganizacional()
        {
            return dao.ListarTodos();
        }

        
        
        public string ValidaEliminacion(string iCodUOr, string iCodUsu)
        {
            return daoUsuarioUO.ValidaEliminacion(int.Parse(iCodUOr),int.Parse(iCodUsu));
        }

       
        
        
        
        
        
        public GRUsuario Login(string usuario, string contraseña)
        {
            return daousuario.obtenerUsuario(usuario,contraseña);
        }


        public void EliminarUnidadOrganizacional(string iCodUOr)
        {
            throw new NotImplementedException();
        }
    }
}
